#ifndef __VTOR_KEY_H
#define __VTOR_KEY_H

#ifdef __cplusplus
extern "C" {
#endif

#include "vtor_elec_module_config.h"

#ifdef __VTOR_KEY__

// 间隔扫描，单位为ms 与 消抖时长
// 允许用户自己设置扫描时间
#ifdef VTOR_KEY_CONFIG_BY_USERSELF

#else
#define VTOR_KEY_TIME_SHAKE				20
#define VTOR_KEY_TIME_LONG_DOWN	 		200
#define VTOR_KEY_TIME_LONG_UP	 		200
#define VTOR_KEY_TIME_MAX 				1000
#endif // VTOR_KEY_CONFIG_BY_USERSELF

// 按键电平
#define VTOR_KEY_LEVEL_DOWN					0
#define VTOR_KEY_LEVEL_UP					1

// 按键状态
#define VTOR_KEY_STATS_SHAKE				0
#define VTOR_KEY_STATS_UP					1
#define VTOR_KEY_STATS_DOWN					2
#define VTOR_KEY_STATS_LONG_DOWN			3
#define VTOR_KEY_STATS_LONG_UP				4

// 组合按键，当弹起时才相应
#define VTOR_KEY_COMBINE_NULL				0
#define VTOR_KEY_COMBINE_SHORT_CLICK		1
#define VTOR_KEY_COMBINE_LONG_CLICK			2

#define VTOR_KEY_COMBINE_SS_CLICK			11
#define VTOR_KEY_COMBINE_SSS_CLICK			111
#define VTOR_KEY_COMBINE_LL_CLICK			22
#define VTOR_KEY_COMBINE_LLL_CLICK			222
#define VTOR_KEY_COMBINE_SL_CLICK			12
#define VTOR_KEY_COMBINE_LS_CLICK			21
#define VTOR_KEY_COMBINE_SSL_CLICK			112
#define VTOR_KEY_COMBINE_LSS_CLICK			211
#define VTOR_KEY_COMBINE_SLL_CLICK			122
#define VTOR_KEY_COMBINE_LLS_CLICK			221
#define VTOR_KEY_COMBINE_SLS_CLICK			121
#define VTOR_KEY_COMBINE_LSL_CLICK			212


typedef struct VtorKeyStruct
{
	uint8_t lastLevel;
	uint8_t curLevel;
	uint8_t lastState;
	uint8_t curState;
	uint16_t holdTime; // 电平稳定时间（用于消抖与确定长按）
	uint8_t combineAction; // 单击，双击，长按等所有情况
	struct VtorKeyStruct *next;
}VtorKey;

extern VtorKey* vtorKeyHeader;

// 用户自行实现初始化与获取电平
void VtorKey_Init(void);
void VtorKey_GetLevel(void);

// 定时调用，需要有大概调用时间
uint8_t VtorKey_Scan(uint16_t scanTime);

// 用户重写回调函数，内部处理对应情况
void VtorKey_CombineHandler(VtorKey* key);
void VtorKey_PressHandler(VtorKey* key);
void VtorKey_ReleaseHandler(VtorKey* key);
void VtorKey_LongPressHoldHandler(VtorKey* key);

#endif // __VTOR_KEY__

#ifdef __cplusplus
}
#endif

#endif

